热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

都市渲染流程解析:首个执行的Pass_1与不同LightMode的选择顺序分析

本文由编程笔记#小编为大家整理,主要介绍了_第一个被执行的Pass_1_不同LightMode 被选择的顺序相关的知识,希望对你有一定的参考价值。 第5章 第一个被执行的Pass 5.1 不同Ligh
本文由编程笔记#小编为大家整理,主要介绍了_第一个被执行的Pass_1_不同LightMode 被选择的顺序相关的知识,希望对你有一定的参考价值。



第5章 第一个被执行的Pass
5.1 不同LightMode 被选择的顺序
5.1.1 渲染路径和Pass的LightMode标签



    Unity支持3种RenderingPath,分别是VertexLit, ForwardDeferred Lighting,为此又定义
了在Pass中使用的LightMode标签Vertex, ForwardBase, ForwardAdd, PrepassBase, PrepassFinal
等,分别表示当前Pass是为在哪一个RenderingPath下设计使用的。


5.1.2设计可以检测渲染路径的材质


    现在的问题就是,在Shader中存在多个适应不同渲染路径的Pass时,Unity会怎么做?是按
照某种次序全部渲染?还是只是挑选出其中一个最优的Pass在对应的渲染路径下渲染?


    首先是Deferred.shader,这是一个被设计为只会在Camera的RenderingPath为Deferred模式
下输出红色的Shader,其代码如下:


Shader "Tut/Lighting/FirstLight/Lab_1/Deferred"
Properties
_MainTex ("Base (RGB)", 2D) = "white"

SubShader
Tags "RenderType"="Opaque"
Blend One One
CGPROGRAM
#pragma surface surf MyDeferred
half4 LightingMyDeferred_PrePass (SurfaceOutput s, half4 light)
half4 c;
c.rgb = s.Albedo;
c.a = s.Alpha;
return c;

struct Input
float2 uv_MainTex;
;
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o)
o.Albedo=float3(1,0,0);

ENDCG


再就是Deferred_Forward.shader,这是一个包含可以适应Deferred以及Forward渲染路径的材
质,其中适应Deferred的部分输出(1 ,0, 0, 1)的红色,而适应Forward的部分只会输出的(0,
1, 0,  1)绿色;两个部分都使用了Blend One One混合模式,也就是说如果两部分都执行的话,
应该会输出(1,  1,  0,  1)的黄色,反之则只会输出被执行的那一个的输出颜色,也就是红色或
者绿色。其代码如下:






Shader "Tut/Lighting/FirstLight/Lab_1/Deferred_Forward"
SubShader
Blend One One
//.1
pass
Tags "LightMode"="ForwardBase"
Blend One One
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
struct vertOut
float4 pos:SV_POSITION;
float4 color:COLOR;
;
vertOut vert(appdata_base v)

vertOut o;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
o.color=float4(0,1,0,1);
return o;

float4 frag(vertOut i):COLOR

return i.color;

ENDCG
//end pass
//.2
CGPROGRAM
#pragma surface surf MyDeferred
half4 LightingMyDeferred_PrePass (SurfaceOutput s, half4 light)
half4 c;
c.rgb = s.Albedo;
c.a = s.Alpha;
return c;

struct Input
float2 uv_MainTex;
;
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o)
o.Albedo=float3(1,0,0);

ENDCG


    然后是Deferred_Forward_Vertex.shader,这个Shader和上面的Deferred_Forward.shader类似,
不同的是添加了可以适应VertexLit渲染路径的Pass,会输出蓝色。也就是说,如果3个都执行,
则会输出白色(1,1,1,1),否则会输出红、绿、蓝3个颜色的一个或两个的组合。其代码如一下:


Shader "Tut/Lighting/FirstLight/Lab_1/Deferred_Forward_Vertex"
SubShader
Blend One One
//.1
pass
Tags "LightMode"="Vertex"
Blend One Zero
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
struct vertOut
float4 pos:SV_POSITION;
float4 color:COLOR;
;
vertOut vert(appdata_base v)

vertOut o;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
o.color=float4(0,0,1,1);
return o;

float4 frag(vertOut i):COLOR

return i.color;

ENDCG
//end pass
//.2
pass
Tags "LightMode"="ForwardBase"
Blend One One
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
struct vertOut
float4 pos:SV_POSITION;
float4 color:COLOR;
;
vertOut vert(appdata_base v)

vertOut o;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
o.color=float4(0,1,0,1);
return o;

float4 frag(vertOut i):COLOR

return i.color;

ENDCG
//end pass
//.3
CGPROGRAM
#pragma surface surf MyDeferred
half4 LightingMyDeferred_PrePass (SurfaceOutput s, half4 light)
half4 c;
c.rgb = s.Albedo;
c.a = s.Alpha;
return c;

struct Input
float2 uv_MainTex;
;
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o)
o.Albedo=float3(1,0,0);

ENDCG


    最后还有Deferred_Vertex.shader,这是一个含有可以适应Deferred和VertexLit模式的材质。
和Deferred_Forward_Vertex.shader类似,只不过去掉了适应Forward渲染路径的部分。还有
Forwardes_Vertex.shader,这个Shader去掉了适应Deferred模式的部分,还有单独适应Forward渲
染路径的Forward.shader,以及单独适应VertexLit渲染路径的Vertex.shader。其具体实现都很简单,
但是所有针对Deferred渲染路径的Pass最终都会输出红色(1,  0,  0,  1),所有针对Forward渲
染路径的Pass最终都会输出绿色(0, 1, 1, 1),所有针对VertexLit渲染路径的Pass最终都会输
出蓝色(0,  0,  1,  1)。


5.1.3设计便于检测渲染路径的场景


    在具体的场景中布置丰富的光源,可以保证任何一个RenderingPath都可以得到想要的光照,
将场景的主相机背景色设置为黑色,背景就不会对材质的Blend One One操作造成任何影响,绿
色的控制面板上的一系列按钮可以帮我们切换灯光的类型,以及Camera的RenderingPath。现在
我们可以根据不同渲染路径下颜色的输出判断不同的渲染路径下哪些Pass被执行,哪些没有。编
译并执行此场景。


5.1.4 VertexLit渲染路径下Pass的执行

    首先切换Camera到VertexLit模式下,如图所示。可以看到只有含LightMode = Vertex的Pass会被执行,并输出蓝色,其他的都没有被执行。



5.1.5 Forward渲染路径下Pass的执行

    切换相机到Forward渲染路径,可以看到如图所示的结果。凡是包含了针对Forward渲染路径的Pass都会被执行,并输出相应的绿色。如果没有包含针对Forward渲染路径的Pass,但是包含了针对VertexLit渲染路径的Pass,则也会被执行,并输出相应的蓝色。但是如果有Forward渲染路径的Pass可执行,就不会执行VertexLit渲染路径的Pass。针对Deferred渲染路径的Pass不会被执行。



5.1.6  Deferred渲染路径下Pass的执行

    再切换相机到Deferred渲染路径下,可以看到如图所示的结果。所有材质,凡是包含了针对Deferred的Pass可执行,则执行Deferred的Pass,并输出红色,其他Pass不会被执行。如果不包含针对Deferred的Pass,而且材质包含了Forward的Pass,则执行针对Forward设计的Pass输出相应的绿色。如果材质既没有针对Deferred的Pass,也没有针对Forward的Pass,则会执行Vertex的Pass,并输出蓝色。



5.1.7不同渲染路径下的Pass执行规则总结


    我们可以总结出,Unity在Deferred渲染路径下,则会寻找可在Deferred渲染模式下的Pass
然后返回,并不会执行其他渲染路径下的Pass,但是如果找不到Deferred状态下的Pass,则会再寻找Forward模式下的Pass并执行,然后返回,如果Forward模式下的Pass依然没有找到,则会寻找VertexLit模式下的Pass并执行。在Forward渲染路径下,会优先寻找Forward模式下可渲染的Pass,如果找不到,才会寻找 VertexLit模式下可渲染的Pass。


      但是无论如何,Unity在一个时间只会执行一个渲染路径下的Pass,它并不会将全部可执行
Pass都渲染
推荐阅读
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 优化ASM字节码操作:简化类转换与移除冗余指令
    本文探讨如何利用ASM框架进行字节码操作,以优化现有类的转换过程,简化复杂的转换逻辑,并移除不必要的加0操作。通过这些技术手段,可以显著提升代码性能和可维护性。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
author-avatar
涩味122_508
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有